
// fs => file system    => 负责文件读取 写入  文件/文件夹的增 删 改 查


// 文件  文件夹的增删改查
// 文件
// fs.writeFile  文件新增/修改   => 默认没有就新增,有就修改
// fs.unlink     文件删除

// 文件夹
// fs.mkdir()
// fs.rmdir()
// fs.readdir
// fs.state


// fs.existsSync  文件 文件夹是否存在
// fs.rename      文件 文件夹改名


var fs = require("fs");
var path = require("path");
// console.log(fs);


// fs.readFile(url,[encoding],callback)  //异步读取  (先执行所有的同步任务,异步任务放任务队列,等所有同步任务执行完毕, 异步任务才进入主线程执行 -> callback)
// url => 读取的文件地址
// encoding => 需要采用哪种字符编码集来进行内容读取  (utf-8,binary)
// callback  => 当文件读取完毕之后的回调函数
//    该回调函数会接收两个形参   error,data
//         第一个形参为读取失败时的错误信息
//         第二个形参为读取成功时的文本内容

// fs.readFileSync(url,[encoding])    // 同步读取

// 注意: 
//  url => 读取的文件地址  => 如果传入的路径是相对路径,默认以process.cwd() 为基本路径

// 基本路径 process.cwd() =>  C:\Users\怀霜凌志\Desktop\2302\node  => 报错
// fs.readFile("./data/1.txt","utf-8",function(err,ctx){ 
//     // err => 文件读取失败时的错误原因(对象)   ctx=> 读取的内容
//     if(!err){
//         console.log("文件读取成功",ctx);
//     }else{
//         throw err;
//     }
// })

// fs.readFile(path.join(__dirname,"./data/1.txt"),"utf-8",function(err,ctx){ 
//     // err => 文件读取失败时的错误原因(对象)   ctx=> 读取的内容
//     if(!err){
//         console.log("文件读取成功",ctx);
//     }else{
//         throw err;
//     }
// })

// var res= fs.readFileSync(path.join(__dirname,"./data/1.txt"),"utf-8");
// console.log("文件读取成功",res);


// fs.writeFile(url,context,[options],callback);
// url      String 文件名
// context   String|buffer  //需要写入的数据
// option    Object
//           encoding  String |null   default='utf-8'
//            flag      String         default='w' //1、默认"w"(直接写入数据，会清空原有数据)  2、{ 'flag': 'a' } 可重复写入数据
//        flag属性
//            w ：写入文件，文件不存在则创建，存在则清空；(不存在就创建,存在就覆盖)
//            wx ：和w一样，但是文件存在时会报错；
//            w+ ：读取并写入文件，文件不存在则创建，存在则清空；
//            wx+ ：和w+一样，但是文件存在时会报错；
//            a：以追加方式写入文件，文件不存在则创建；(不存在就创建,存在就追加)
//            ax ：和a一样，但是文件存在时会报错；
//            a+ ：读取并追加写入文件，文件不存在则创建；
//            ax+ ：和a+一样，但是文件存在时会报错。
//  callback 动作执行完后的回调函数


/* fs.writeFile(path.join(__dirname,"./data/1.txt"),"这是写入的新内容",{
    encoding:"utf-8",
    flag:"a"
},function(err){ 
    // err => 文件读取失败时的错误原因(对象)   ctx=> 读取的内容
    if(!err){
        console.log("文件写入成功");
    }else{
        throw err;
    }
}) */

/* fs.appendFile(path.join(__dirname,"./data/1.txt"),"这是写入的新内容",{
    encoding:"utf-8",
    flag:"w",
},function(err){ 
    // err => 文件读取失败时的错误原因(对象)   ctx=> 读取的内容
    if(!err){
        console.log("文件写入成功");
    }else{
        throw err;
    }
})
 */




// fs.unlink(url,callback)     // 文件的删除
// fs.existsSync(url)    //  传入一个路径 => 可以判断文件/文件夹是否存在

// var bool = fs.existsSync(path.join(__dirname,"./data/2.txt"));
// console.log(bool);

// fs.unlink(path.join(__dirname,"./data/1.txt"),function(err){
//     if(!err){
//         console.log("删除成功");
//     }else{
//         throw err;
//     }
// })


// 文件夹  
// mkdir(url,callback)   新建文件夹  (mk => make)    注意: 新增之前需要判断文件夹是否存在
// rmdir(url,callback)   删除文件夹  (rm => remove)  注意: 删除文件夹之前需要把文件夹中的所有内容全部删除

// fs.mkdir(path.join(__dirname,"./data/11111"),function(err){
//     if(!err){
//         console.log("文件夹新增成功");
//     }else{
//         throw err;
//     }
// })

// fs.rmdir(path.join(__dirname,"./data/11111"),function(err){
//     if(!err){
//         console.log("文件夹删除成功");
//     }else{
//         throw err;
//     }
// })

// 读取目录
// .readdir(url,callback)  读取目录
// url 为需要被读取的目录路径
// callback 为读取完毕后执行的回调函数
//         第一个形参 error为读取失败时的记录信息
//         第二个形参 list 为读取成功时文件名/目录名集合列表

// .stat(url , callback) 获取文件/目录的相关信息
//     url  为需要获取信息的文件/目录 的路径
//     callback  为读取完毕后的回调函数
//         第一个形参error为读取失败时的错误信息
//         第二个形参info  为读取成功时的相关信息对象
//             该info对象下有两个方法
//                 isFile() 方法用来判断是否为文件
//                 isDirectory() 方法用来判断是否为目录
//                 isBlockDevice()	如果是块设备返回 true，否则返回 false。
//                 isCharacterDevice()	如果是字符设备返回 true，否则返回 false。
//                 isSymbolicLink()	如果是软链接返回 true，否则返回 false。
//                 isFIFO()	如果是FIFO，返回true，否则返回 false。FIFO是UNIX中的一种特殊类型的命令管道。
//                 isSocket()	如果是 Socket 返回 true，否则返回 false。


// 先列举目录列表 => 在判断每一项是文件还是文件夹
/* fs.readdir(path.join(__dirname,"./data"),function(err,list){
    if(!err){
        console.log("目录列举成功",list);
        // for(let i=0;i<list.length;i++){
        //     let item = list[i]; // 1.txt   1111
        //     fs.stat(path.join(__dirname,"./data",item),function(err,info){
        //         if(!err){
        //             if(info.isFile()){
        //                 console.log(item+"是文件");
        //             }else if(info.isDirectory()){
        //                 console.log(item+"是文件夹");
        //             }
        //         }else{
        //             throw err;
        //         }
        //     })
        // }
        
    }else{
        throw err;
    }
})
 */


// rename(oldUrl , newUrl , callback) 修改文件名/目录名      (注:当新的路径和旧的路径不相同时,则会移动文件;)
//     oldUrl 为需要被修改的文件路径(包含文件名)
//     newUrl 为被修改好后的文件(包含文件名)
//     callback 当文件重命名操作执行完毕后的回调函数

// 新旧目录相同 => 改名
// fs.rename(path.join(__dirname,"./data/1.txt"),path.join(__dirname,"./data/2.txt"),function(err){
//     if(!err){
//         console.log("文件名修改成功");
//     }else{
//         throw err;
//     }
// })


fs.rename(path.join(__dirname,"./data/2.txt"),path.join(__dirname,"./data/11111/2.txt"),function(err){
    if(!err){
        console.log("文件名修改成功");
    }else{
        throw err;
    }
})
